/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.manchini.stereocv.bd;

import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.ext.ExtObjectContainer;
import com.db4o.query.Predicate;
import java.util.ArrayList;
import java.util.List;

public class ControleBD {

    private ExtObjectContainer bd;

    /**
     * Recebe como argumento a localização do banco. Uma entrada válida seria
     * 'db.yap'
     */
    public ExtObjectContainer getDB() {
        return this.bd;
    }

    public ControleBD() {
        open();
    }

    /**
     * Busca um objeto no banco e deleta os resultados
     */
    public void del(Object objj) {
        ObjectSet obj;
        obj = bd.queryByExample(objj);
        while (obj.hasNext()) {
            bd.delete(obj.next());
        }
    }

    /**
     * Retorna uma lista de objetos
     */
    public List get(Object objj) {
        ObjectSet obj;
        obj = bd.queryByExample(objj);
//        System.out.println( "Tamanho do resultado: "+ obj.size() );
        List<Object> list = new ArrayList<Object>();
        while (obj.hasNext()) {
            list.add(obj.next());
        }
        return list;
    }

    public ArrayList listar(Class tipo) {
        ObjectSet obj;
        obj = bd.query(tipo);
        ArrayList list = new ArrayList();
        while (obj.hasNext()) {
            list.add(obj.next());
        }
        return list;
    }

    public void store(Object obj) {
        bd.store(obj);
    }

    /**
     * Abre a conexão com o banco de dados Note também que mesmo o db criando um
     * ObjectContainer o que realmente é usado pela aplicação é o
     * ExtObjectContainer que é uma instância do ObjectContainer só que mais
     * completa e apropriada para produção.
     */
    private void open() {
        ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "bd.yap");
        this.bd = db.ext();
    }

    /**
     * Fecha a conexão com o banco.
     */
    public void close() {
        if (!this.bd.isClosed()) {
            bd.close();
        }
    }

    public Objeto existe(final Objeto obj) {
        ObjectSet result = bd.query(new Predicate<Objeto>() {

            @Override
            public boolean match(Objeto et) {
                if (et.getId().intValue() == obj.getId().intValue()
                        && et.getClass().toString().equals(obj.getClass().toString())) {
                    return true;
                } else {
                    return false;
                }
            }
        });
        if (result.hasNext()) {
            return (Objeto) result.next();
        } else {
            return null;
        }
    }
}